Add API to force a GtkIconHelper pixbuf rescaling
authorCarlos Garnacho <carlos@lanedo.com>
Fri, 13 Jul 2012 13:54:29 +0000 (15:54 +0200)
committerCarlos Garnacho <carlos@lanedo.com>
Fri, 13 Jul 2012 14:56:37 +0000 (16:56 +0200)
This API is handy in entries and status icons, where the size is
limited and independent of the pixbuf size

gtk/gtkiconhelper.c
gtk/gtkiconhelperprivate.h

index 589f1e974228bce9e954375b04a8b632f1e24098..6f23914a8c5e83b41b3e700d5d14ad851a034619 100644 (file)
@@ -36,7 +36,8 @@ struct _GtkIconHelperPrivate {
   GtkIconSize icon_size;
   gint pixel_size;
 
-  gboolean use_fallback;
+  guint use_fallback : 1;
+  guint force_scale_pixbuf : 1;
 
   GdkPixbuf *rendered_pixbuf;
   GtkStateFlags last_rendered_state;
@@ -277,6 +278,35 @@ ensure_pixbuf_for_icon_set (GtkIconHelper *self,
     gtk_icon_set_render_icon_pixbuf (icon_set, context, self->priv->icon_size);
 }
 
+static void
+ensure_pixbuf_at_size (GtkIconHelper   *self,
+                       GtkStyleContext *context)
+{
+  gint width, height;
+
+  if (!check_invalidate_pixbuf (self, context))
+    return;
+
+  if (self->priv->rendered_pixbuf)
+    return;
+
+  if (self->priv->pixel_size != -1 ||
+      self->priv->icon_size != GTK_ICON_SIZE_INVALID)
+    {
+      ensure_icon_size (self, context, &width, &height);
+
+      if (width < gdk_pixbuf_get_width (self->priv->orig_pixbuf) ||
+          height < gdk_pixbuf_get_height (self->priv->orig_pixbuf))
+        self->priv->rendered_pixbuf =
+          gdk_pixbuf_scale_simple (self->priv->orig_pixbuf,
+                                   width, height,
+                                   GDK_INTERP_BILINEAR);
+    }
+
+  if (!self->priv->rendered_pixbuf)
+    self->priv->rendered_pixbuf = g_object_ref (self->priv->orig_pixbuf);
+}
+
 GdkPixbuf *
 _gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self,
                                 GtkStyleContext *context)
@@ -287,7 +317,10 @@ _gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self,
   switch (self->priv->storage_type)
     {
     case GTK_IMAGE_PIXBUF:
-      pixbuf = g_object_ref (self->priv->orig_pixbuf);
+      if (self->priv->force_scale_pixbuf)
+        ensure_pixbuf_at_size (self, context);
+      else
+        pixbuf = g_object_ref (self->priv->orig_pixbuf);
       break;
 
     case GTK_IMAGE_STOCK:
@@ -563,3 +596,20 @@ _gtk_icon_helper_get_is_empty (GtkIconHelper *self)
 {
   return (self->priv->storage_type == GTK_IMAGE_EMPTY);
 }
+
+gboolean
+_gtk_icon_helper_get_force_scale_pixbuf (GtkIconHelper *self)
+{
+  return self->priv->force_scale_pixbuf;
+}
+
+void
+_gtk_icon_helper_set_force_scale_pixbuf (GtkIconHelper *self,
+                                         gboolean       force_scale)
+{
+  if (self->priv->force_scale_pixbuf != force_scale)
+    {
+      self->priv->force_scale_pixbuf = force_scale;
+      _gtk_icon_helper_invalidate (self);
+    }
+}
index 8cc8a479c90a2959f1cf96f60ff7355e72199b11..c2b9f0804fc1f35ecf06e16950ea355f7784632f 100644 (file)
@@ -124,6 +124,11 @@ void _gtk_icon_helper_draw (GtkIconHelper *self,
                             gdouble x,
                             gdouble y);
 
+gboolean _gtk_icon_helper_get_force_scale_pixbuf (GtkIconHelper *self);
+void     _gtk_icon_helper_set_force_scale_pixbuf (GtkIconHelper *self,
+                                                  gboolean       force_scale);
+
+
 G_END_DECLS
 
 #endif /* __GTK_ICON_HELPER_H__ */